package com.sann.demo.dao.impl;

import com.sann.demo.dao.IAccountDao;
import com.sann.demo.domain.Account;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.support.JdbcDaoSupport;

import java.util.List;

/**
 * extends JdbcDaoSupport就可以直接通过
 * <bean id="accountDao" class="com.sann.demo.dao.impl.AccountDaoImpl">
 *         <property name="dataSource" ref="dataSource"/>
 * </bean>
 * 注入dataSource了，是通过 JdbcDaoSupport 类中的 public final void setDataSource(DataSource dataSource){}
 * 实现的。该方法是final的，我们Dao层是重写不了的。确保了安全性。我们的Dao层要使用 jdbcTemplate，那就通过 Spring的
 * JdbcDaoSupport 提供的 getJdbcTemplate() 即可。
 */
public class AccountDaoImpl extends JdbcDaoSupport implements IAccountDao {
//    这些注释的代码 Spring的 JdbcDaoSupport 都帮我们提取封装了，我们只要通过Spring 提供的 getJdbcTemplate()
//    就可以获取到 JdbcTemplate，但是前提是我们的通过给Dao层提供 DataSource。
//    private DataSource dataSource;
//
//    public void setDataSource(DataSource dataSource) {
//        this.dataSource = dataSource;
//        createJdbcTemplate(dataSource);
//    }
//
//    protected JdbcTemplate createJdbcTemplate(DataSource dataSource){
//        return new JdbcTemplate(dataSource);
//    }

    @Override
    public Account findAccountById(Integer accountId) {
        List<Account> accounts = super.getJdbcTemplate().query("select * from tb_account where id=?", new BeanPropertyRowMapper<Account>(Account.class), 1);
        return accounts.isEmpty()?null:accounts.get(0);
    }

    @Override
    public Account findAccountByName(String accountName) {
        List<Account> accounts = super.getJdbcTemplate().query("select * from tb_account where name like ?", new BeanPropertyRowMapper<Account>(Account.class), "%"+accountName+"%");
        if(accounts.isEmpty()) {
            return null;
        }
        if(accounts.size()>1) {
            throw new RuntimeException("结果集不唯一");
        }
        return accounts.get(0);
    }

    @Override
    public void updateAccount(Account account) {
        super.getJdbcTemplate().update("update tb_account set name=?, money=? where id=?", account.getName(), account.getMoney(), account.getId());
    }
}
